#include"myStdio.h"
FILE_* fopen_(const char* path_name,const char* mode)
{
  int flags=0;
  int defaultMode=0666;
  if(strcmp(mode,"r")==0)
  {
    flags|=O_RDONLY;
  }
  else if(strcmp(mode,"w")==0)
  {
    flags|=(O_WRONLY|O_CREAT|O_TRUNC);
  }
  else if(strcmp(mode,"a")==0)
  {
   flags|=(O_WRONLY|O_CREAT|O_APPEND);
  }
  else{
  //DO nothing
  }
  int fd=0;
  if(flags&O_RDONLY) fd=open(path_name,flags);
  else fd=open(path_name,flags,defaultMode);
    if(fd<0)
    {
      const char* err=strerror(errno);
      write(2,err,strlen(err));
    return NULL;//为什么打开文件会返回NULL
    }
   FILE_* fp=(FILE_*)malloc(sizeof(FILE_));
   assert(fp);
   fp->flags=SYNC_LINE;//默认设置为行刷新
   fp->fileno=fd;
   fp->cap=SIZE;
   fp->size=0;
   memset(fp->buffer,0,SIZE);
   return fp;//为什么你们打开以文件就会返回一个FILE*指针
}
void fwrite_(const void* ptr,int num,FILE_* fp)
{
  //把数据写入缓冲区中
   memcpy(fp->buffer+fp->size,ptr,num);//这里我们不来考虑缓冲区溢出的问题
   fp->size+=num;
   //2.判断是否刷新
   if(fp->flags&SYNC_NOW)
   {
 write(fp->fileno,fp->buffer,fp->size);
 fp->size=0;
   }
   else if(fp->flags&SYNC_FULL)
   {
      if(fp->size==fp->cap)
      { 
      
  write(fp->fileno,fp->buffer,fp->size);
        fp->size=0;     
   }
   }
   else  if(fp->flags&SYNC_LINE)
   {
      if(fp->buffer[fp->size-1]=='\n')//abcd\nswe不考虑
      {
         write(fp->fileno,fp->buffer,fp->size);
         fp->size=0;
      }
   }
   else{
     //DO NOTHING
   }
}
void fflush_(FILE_* fp)
{
 if(fp->size>0)  write(fp->fileno,fp->buffer,fp->size);
 fsync(fp->fileno);//将数据据强制要求OS刷新到磁盘
 fp->size=0;
}
void fclose_(FILE_* fp)
{
  fflush_(fp);
  close(fp->fileno);
}
